home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / misc / low-leve / rdev.c < prev    next >
C/C++ Source or Header  |  1996-11-17  |  11KB  |  448 lines

  1. From samba!concert!gatech!destroyer!sol.ctr.columbia.edu!usc!snorkelwacker.mit.edu!bloom-picayune.mit.edu!daemon Sun Oct 18 18:24:42 EDT 1992
  2. Article: 13504 of comp.os.linux
  3. Newsgroups: comp.os.linux
  4. Path: samba!concert!gatech!destroyer!sol.ctr.columbia.edu!usc!snorkelwacker.mit.edu!bloom-picayune.mit.edu!daemon
  5. From: Peter MacDonald <pmacdona@tadpole.bcsc.gov.bc.ca>
  6. Subject: Patch to preselect video mode + set ramdisk size
  7. Message-ID: <1992Oct17.073112.13670@athena.mit.edu>
  8. Sender: daemon@athena.mit.edu (Mr Background)
  9. Reply-To: pmacdona@tadpole.bcsc.gov.bc.ca
  10. Organization: The Internet
  11. Date: Sat, 17 Oct 1992 07:31:12 GMT
  12. Lines: 561
  13.  
  14. Here is my first patch in a good long time.  It does two things.
  15.  
  16. 1) Using a modified version of rdev.c, we can set the startup video
  17. mode of an image.  No more recompiling if you want to change modes.
  18. Example:
  19.         
  20.     vidmode /dev/fd0 1
  21.  
  22. Here, vidmode is just a link to the new rdev.c pgm enclosed.
  23.  
  24. 2) Set the ramdisk size to nonzero to boot up using a ramdisk.
  25. Loading starts from the 512K mark.  Like so:
  26.  
  27.     ramsize /dev/fd0 620
  28.  
  29. Following are the patches, 
  30. Let me know of any problems.
  31.  
  32. Peter
  33. pmacdona@sanjuan.uvic.ca
  34.  
  35. -----------------------------------------------------------------
  36. *** boot/setup.S.bak    Fri Oct 16 18:05:07 1992
  37. --- boot/setup.S    Fri Oct 16 23:51:04 1992
  38. ***************
  39. *** 282,292 ****
  40.   chsvga:    cld
  41.       push    ds
  42.       push    cs
  43.       pop    ds
  44.       mov     ax,#0xc000
  45.       mov    es,ax
  46.       lea    si,msg1
  47. - #ifndef SVGA_MODE
  48.       call    prtstr
  49.   flush:    in    al,#0x60        ! Flush the keyboard buffer
  50.       cmp    al,#0x82
  51. --- 282,297 ----
  52.   chsvga:    cld
  53.       push    ds
  54.       push    cs
  55. +     mov    ax,[0x01f6]
  56.       pop    ds
  57. +     mov    [0x01f6],ax
  58. +         cmp    ax,#NORMAL_VGA
  59. +     je    defvga
  60. +     cmp    ax,#0xfffe
  61. +     jne    svga
  62.       mov     ax,#0xc000
  63.       mov    es,ax
  64.       lea    si,msg1
  65.       call    prtstr
  66.   flush:    in    al,#0x60        ! Flush the keyboard buffer
  67.       cmp    al,#0x82
  68. ***************
  69. *** 297,308 ****
  70.       je    svga            ! yes - svga selection
  71.       cmp    al,#0xb9        ! space ?
  72.       jne    nokey            ! no - repeat
  73. ! #endif
  74. ! #if !defined(SVGA_MODE) || SVGA_MODE == NORMAL_VGA
  75. !     mov    ax,#0x5019
  76.       pop    ds
  77.       ret
  78. - #endif
  79.   svga:    cld
  80.       lea     si,idati        ! Check ATI 'clues'
  81.       mov    di,#0x31
  82. --- 302,310 ----
  83.       je    svga            ! yes - svga selection
  84.       cmp    al,#0xb9        ! space ?
  85.       jne    nokey            ! no - repeat
  86. ! defvga:    mov    ax,#0x5019
  87.       pop    ds
  88.       ret
  89.   svga:    cld
  90.       lea     si,idati        ! Check ATI 'clues'
  91.       mov    di,#0x31
  92. ***************
  93. *** 552,560 ****
  94.       call    prtstr
  95.       pop    si
  96.       add    cl,#0x80
  97. ! #if defined(SVGA_MODE) && SVGA_MODE != NORMAL_VGA
  98. !     mov    al,#SVGA_MODE        ! Preset SVGA mode 
  99. ! #else
  100.   nonum:    call    getkey
  101.       cmp    al,#0x82
  102.       jb    nonum
  103. --- 554,564 ----
  104.       call    prtstr
  105.       pop    si
  106.       add    cl,#0x80
  107. !     mov    ax,[0x01f6]
  108. !     cmp    ax,#0xfffe
  109. !     je    nonum
  110. !     cmp    ax,#NORMAL_VGA
  111. !     jne    gotmode
  112.   nonum:    call    getkey
  113.       cmp    al,#0x82
  114.       jb    nonum
  115. ***************
  116. *** 566,573 ****
  117.   zero:    sub    al,#0x0a
  118.   nozero:    sub    al,#0x80
  119.       dec    al
  120. ! #endif
  121. !     xor    ah,ah
  122.       add    di,ax
  123.       inc    di
  124.       push    ax
  125. --- 570,576 ----
  126.   zero:    sub    al,#0x0a
  127.   nozero:    sub    al,#0x80
  128.       dec    al
  129. ! gotmode:    xor    ah,ah
  130.       add    di,ax
  131.       inc    di
  132.       push    ax
  133. *** boot/bootsect.S.bak    Thu Oct 15 22:53:53 1992
  134. --- boot/bootsect.S    Fri Oct 16 19:09:27 1992
  135. ***************
  136. *** 425,431 ****
  137.       .byte 13,10
  138.       .ascii "Loading"
  139.   
  140. ! .org 506
  141.   swap_dev:
  142.       .word SWAP_DEV
  143.   root_dev:
  144. --- 425,435 ----
  145.       .byte 13,10
  146.       .ascii "Loading"
  147.   
  148. ! .org 502
  149. ! video_mode:
  150. !     .word 0xFFFE
  151. ! ramdisk_size:
  152. !     .word  0
  153.   swap_dev:
  154.       .word SWAP_DEV
  155.   root_dev:
  156. *** init/main.c.bak    Fri Oct 16 17:30:22 1992
  157. --- init/main.c    Fri Oct 16 19:15:25 1992
  158. ***************
  159. *** 86,91 ****
  160. --- 86,92 ----
  161.   #define EXT_MEM_K (*(unsigned short *)0x90002)
  162.   #define DRIVE_INFO (*(struct drive_info *)0x90080)
  163.   #define SCREEN_INFO (*(struct screen_info *)0x90000)
  164. + #define RAMDISK_SIZE (*(unsigned short *)0x901F8)
  165.   #define ORIG_ROOT_DEV (*(unsigned short *)0x901FC)
  166.   #define AUX_DEVICE_INFO (*(unsigned char *)0x901FF)
  167.   
  168. ***************
  169. *** 145,150 ****
  170. --- 146,152 ----
  171.   struct screen_info screen_info;
  172.   
  173.   unsigned char aux_device_present;
  174. + int ramdisk_size;
  175.   
  176.   void start_kernel(void)
  177.   {
  178. ***************
  179. *** 156,161 ****
  180. --- 158,164 ----
  181.        drive_info = DRIVE_INFO;
  182.        screen_info = SCREEN_INFO;
  183.       aux_device_present = AUX_DEVICE_INFO;
  184. +     ramdisk_size = RAMDISK_SIZE;
  185.       sprintf(term, "TERM=con%dx%d", ORIG_VIDEO_COLS, ORIG_VIDEO_LINES);
  186.       envp[1] = term;    
  187.       envp_rc[1] = term;
  188. *** kernel/blk_drv/ramdisk.c.bak    Thu Oct 15 23:19:10 1992
  189. --- kernel/blk_drv/ramdisk.c    Sat Oct 17 00:11:22 1992
  190. ***************
  191. *** 6,12 ****
  192.   
  193.   
  194.   #include <linux/config.h>
  195. - #ifdef RAMDISK
  196.   #include <linux/sched.h>
  197.   #include <linux/minix_fs.h>
  198.   #include <linux/fs.h>
  199. --- 6,11 ----
  200. ***************
  201. *** 87,93 ****
  202.   {
  203.       struct buffer_head *bh;
  204.       struct minix_super_block s;
  205. !     int        block = 512;    /* Start at block 256 */
  206.       int        i = 1;
  207.       int        nblocks;
  208.       char        *cp;        /* Move pointer */
  209. --- 86,92 ----
  210.   {
  211.       struct buffer_head *bh;
  212.       struct minix_super_block s;
  213. !     int        block = 256;    /* Start at block 256 */
  214.       int        i = 1;
  215.       int        nblocks;
  216.       char        *cp;        /* Move pointer */
  217. ***************
  218. *** 138,141 ****
  219.       printk("\ndone\n");
  220.       ROOT_DEV=0x0101;
  221.   }
  222. - #endif
  223. --- 137,139 ----
  224. *** kernel/blk_drv/genhd.c.bak    Thu Oct 15 23:21:02 1992
  225. --- kernel/blk_drv/genhd.c    Thu Oct 15 23:22:58 1992
  226. ***************
  227. *** 18,23 ****
  228. --- 18,25 ----
  229.   
  230.   static int current_minor = 0;
  231.   extern int *blk_size[];
  232. + extern int ramdisk_size;
  233.   /*
  234.    * Create devices for each logical partition in an extended partition.
  235.    * The logical partitions form a linked list, with each entry being
  236. ***************
  237. *** 188,196 ****
  238.       if (nr)
  239.           printk("Partition table%s ok.\n\r",(nr>1)?"s":"");
  240.   
  241. ! #ifdef RAMDISK
  242. !     rd_load();
  243. ! #endif
  244.       mount_root();
  245.       return (0);
  246.   }
  247. --- 190,197 ----
  248.       if (nr)
  249.           printk("Partition table%s ok.\n\r",(nr>1)?"s":"");
  250.   
  251. !     if (ramdisk_size)
  252. !         rd_load();
  253.       mount_root();
  254.       return (0);
  255.   }
  256. *** kernel/blk_drv/ll_rw_blk.c.bak    Thu Oct 15 23:21:42 1992
  257. --- kernel/blk_drv/ll_rw_blk.c    Thu Oct 15 23:23:28 1992
  258. ***************
  259. *** 18,23 ****
  260. --- 18,24 ----
  261.   #include "blk.h"
  262.   
  263.   extern long rd_init(long mem_start, int length);
  264. + extern int ramdisk_size;
  265.   
  266.   /*
  267.    * The request-struct contains all necessary data
  268. ***************
  269. *** 296,304 ****
  270.   #ifdef CONFIG_BLK_DEV_HD
  271.       mem_start = hd_init(mem_start,mem_end);
  272.   #endif
  273. ! #ifdef RAMDISK
  274. !     mem_start += rd_init(mem_start, RAMDISK*1024);
  275. ! #endif
  276.       return mem_start;
  277.   }
  278.   
  279. --- 297,304 ----
  280.   #ifdef CONFIG_BLK_DEV_HD
  281.       mem_start = hd_init(mem_start,mem_end);
  282.   #endif
  283. !     if (ramdisk_size)
  284. !         mem_start += rd_init(mem_start, ramdisk_size*1024);
  285.       return mem_start;
  286.   }
  287.   
  288. *** rdev.c.bak    Sat Oct 17 00:13:52 1992
  289. --- rdev.c    Sat Oct 17 00:13:31 1992
  290. ***************
  291. *** 0 ****
  292. --- 1,150 ----
  293. + /*
  294. + Date: 11 Mar 92 21:37:37 GMT
  295. + Subject: rdev - query/set root device
  296. + From: almesber@nessie.cs.id.ethz.ch (Werner Almesberger)
  297. + Organization: Swiss Federal Institute of Technology (ETH), Zurich, CH
  298. + With all that socket, X11, disk driver and FS hacking going on, apparently
  299. + nobody has found time to address one of the minor nuisances of life: set-
  300. + ting the root FS device is still somewhat cumbersome. I've written a little
  301. + utility which can read and set the root device in boot images:
  302. +     rdev /dev/at0  (or rdev /linux, etc.) displays the current root device
  303. +     rdev /dev/at0 /dev/hda2         sets it to /dev/hda2
  304. +     sdev /dev/at0 /dev/hda2         sets swapdev to /dev/hda2
  305. +     ramsize /dev/at0 N                sets ramdisk size to N
  306. +     vidmode /dev/at0 N              sets default video mode to N
  307. + rdev accepts an optional offset argument, just in case the address should
  308. + ever move from 508. If called without arguments, rdev outputs an mtab line
  309. + for the current root FS, just like /etc/rootdev does.
  310. + ramsize sets the size of the ramdisk.  If size is zero, no ramdisk is used.
  311. + vidmode sets the default video mode at bootup time.  -1 uses default video
  312. + mode, -2 uses menu.
  313. + ram
  314. + raia - Werner
  315. +    _________________________________________________________________________
  316. +   / Werner Almesberger, ETH Zuerich, CH      almesber@nessie.cs.id.ethz.ch /
  317. +  / IFW A44  Tel. +41 1 254 7213                 almesberger@rzvax.ethz.ch /
  318. + /_BITNET:_ALMESBER@CZHETH5A__HEPNET/CHADNET:_[20579::]57414::ALMESBERGER_/
  319. + */
  320. + /* rdev.c  -  query/set root device. */
  321. + /* usage: rdev [ boot-image ] [ root-device ] [ offset ] */
  322. + #include <stdio.h>
  323. + #include <string.h>
  324. + #include <ctype.h>
  325. + #include <errno.h>
  326. + #include <fcntl.h>
  327. + #include <dirent.h>
  328. + #include <unistd.h>
  329. + #include <stdlib.h>
  330. + #include <sys/types.h>
  331. + #include <sys/stat.h>
  332. + #define DEFAULT_OFFSET 508
  333. + static void die(char *msg)
  334. + {
  335. +     perror(msg);
  336. +     exit(1);
  337. + }
  338. + static char *find_dev(int number)
  339. + {
  340. +     DIR *dp;
  341. +     struct dirent *dir;
  342. +     static char name[PATH_MAX+1];
  343. +     struct stat s;
  344. +     if (!number) return "Boot device";
  345. +     if ((dp = opendir("/dev")) == NULL) die("opendir /dev");
  346. +     strcpy(name,"/dev/");
  347. +     while (dir = readdir(dp)) {
  348. +     strcpy(name+5,dir->d_name);
  349. +     if (stat(name,&s) < 0) die(name);
  350. +     if ((s.st_mode & S_IFMT) == S_IFBLK && s.st_rdev == number) return name;
  351. +     }
  352. +     sprintf(name,"0x%04x",number);
  353. +     return name;
  354. + }
  355. + enum { RDEV, SDEV, RAMSIZE, VIDMODE };
  356. + char *cmdnames[4] = { "rdev", "swapdev", "ramsize", "vidmode" }; 
  357. + char *desc[4] = { "Root device", "Swap device", "Ramsize", "Video mode" };
  358. + int main(int argc,char **argv)
  359. + {
  360. +     int image,offset,dev_nr, i;
  361. +     char *device, cmd = 0, *ptr, tmp[40];
  362. +     struct stat s;
  363. +     device = NULL;
  364. +     if (ptr = strrchr(argv[0],'/'))
  365. +         ptr++;
  366. +     else
  367. +         ptr = argv[0];
  368. +     for (i=RDEV; i<=VIDMODE; i++)
  369. +         if (!strcmp(ptr,cmdnames[i]))
  370. +         break;
  371. +     cmd = i;
  372. +     if (cmd>VIDMODE)
  373. +         cmd=RDEV;
  374. +     offset = DEFAULT_OFFSET-cmd*2;
  375. +     if  ((cmd==RDEV) && (argc == 1 || argc > 4)) {
  376. +     if (stat("/",&s) < 0) die("/");
  377. +     printf("%s /\n",find_dev(s.st_dev));
  378. +     exit(0);
  379. +     }
  380. +     if ((cmd==RDEV) || (cmd==SDEV))
  381. +     {    
  382. +         if (argc == 4) {
  383. +         device = argv[2];
  384. +         offset = atoi(argv[3]);
  385. +         }
  386. +         else {
  387. +         if (argc == 3) {
  388. +             if (isdigit(*argv[2])) offset = atoi(argv[2]);
  389. +             else device = argv[2];
  390. +         }
  391. +         }
  392. +     }
  393. +     else
  394. +     {
  395. +         if (argc==3)
  396. +         device = argv[2];
  397. +     }
  398. +     if (device) {
  399. +         if ((cmd==SDEV) || (cmd==RDEV))
  400. +     {    if (stat(device,&s) < 0) die(device);
  401. +     } else
  402. +         s.st_rdev=atoi(device);
  403. +     if ((image = open(argv[1],O_WRONLY)) < 0) die(argv[1]);
  404. +     if (lseek(image,offset,0) < 0) die("lseek");
  405. +     if (write(image,(char *)&s.st_rdev,2) != 2) die(argv[1]);
  406. +     if (close(image) < 0) die("close");
  407. +     }
  408. +     else {
  409. +     if ((image = open(argv[1],O_RDONLY)) < 0) die(argv[1]);
  410. +     if (lseek(image,offset,0) < 0) die("lseek");
  411. +     dev_nr = 0;
  412. +     if (read(image,(char *)&dev_nr,2) != 2) die(argv[1]);
  413. +     if (close(image) < 0) die("close");
  414. +     printf(desc[cmd]);
  415. +     if ((cmd==SDEV) || (cmd==RDEV))
  416. +         printf(" %s\n", find_dev(dev_nr));
  417. +     else
  418. +         printf(" %d\n", dev_nr);
  419. +     }
  420. +     return 0;
  421. + }
  422. -----------------------------------------------------------------
  423.  
  424.  
  425.  
  426.